﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Studio7i.CapaDominio;


namespace Studio7i.CapaPersistencia.DAO
{
    public class ReservaDAO:IReservaDAO
    {

        // Dependencias
        IClienteDAO ClienteDAO = new ClienteDAO();
        ISalaDAO SalaDAO = new SalaDAO();


        // Métodos CRUD
        /**********************************************************************************************************/
        public Reserva Crear(Reserva ReservaACrear)
        {
            string _Sentencia = "INSERT INTO Reserva VALUES(@codigo,@feinicio,@fefinal,@ssreserva,@sala,@cliente)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@feinicio", ReservaACrear.FeInicio));
                    _Comando.Parameters.Add(new SqlParameter("@fefinal", ReservaACrear.FeFinal));
                    _Comando.Parameters.Add(new SqlParameter("@ssreserva", ReservaACrear.SsReserva));
                    _Comando.Parameters.Add(new SqlParameter("@sala", ReservaACrear.Sala.CoSala));
                    _Comando.Parameters.Add(new SqlParameter("@cliente", ReservaACrear.Cliente.CoCliente));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        /**********************************************************************************************************/
        public Reserva Obtener(int codigo)
        {
            string _Sentencia = "SELECT * FROM Reserva WHERE CoReserva=@codigo";
            Reserva ReservaCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            ReservaCreado = new Reserva();
                            ReservaCreado.CoReserva = (int)_Resultado["CoReserva"];
                            ReservaCreado.FeInicio = (string)_Resultado["FeInicio"];
                            ReservaCreado.FeFinal = (string)_Resultado["FeFinal"];
                            ReservaCreado.SsReserva = (decimal)_Resultado["SsReserva"];
                            ReservaCreado.Sala = SalaDAO.Obtener((int)_Resultado["CoSala"]);
                            ReservaCreado.Cliente = ClienteDAO.Obtener((int)_Resultado["CoCliente"]);
                        }
                    }
                }
            }
            return ReservaCreado;
        }

        /**********************************************************************************************************/
        public Reserva Modificar(Reserva ReservaAModificar)
        {
            string _Sentencia = "UPDATE Reserva SET FeInicio=@feinicio, FeFinal=@fefinal, SsReserva=@ssreserva, CoSala=@sala, CoCliente=@cliente WHERE CoReserva=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@feinicio", ReservaAModificar.FeInicio));
                    _Comando.Parameters.Add(new SqlParameter("@fefinal", ReservaAModificar.FeFinal));
                    _Comando.Parameters.Add(new SqlParameter("@ssreserva", ReservaAModificar.SsReserva));
                    _Comando.Parameters.Add(new SqlParameter("@sala", ReservaAModificar.Sala.CoSala));
                    _Comando.Parameters.Add(new SqlParameter("@cliente", ReservaAModificar.Cliente.CoCliente));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", ReservaAModificar.CoReserva));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(ReservaAModificar.CoReserva);
        }

        /**********************************************************************************************************/
        public void Eliminar(Reserva ReservaAEliminar)
        {
            string _Sentencia = "DELETE FROM Reserva WHERE CoReserva=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", ReservaAEliminar.CoReserva));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        /**********************************************************************************************************/
        // Métodos Listar
        public ICollection<Reserva> ListarTodos()
        {
            string _Sentencia = "SELECT * FROM Reserva";
            ICollection<Reserva> ReservasEncontrados = new List<Reserva>();
            Reserva ReservaEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ReservaEncontrado = new Reserva();
                            ReservaEncontrado.CoReserva = (int)_Resultado["CoReserva"];
                            ReservaEncontrado.FeInicio = (string)_Resultado["FeInicio"];
                            ReservaEncontrado.FeFinal = (string)_Resultado["FeFinal"];
                            ReservaEncontrado.SsReserva = (decimal)_Resultado["SsReserva"];
                            ReservaEncontrado.Sala = SalaDAO.Obtener((int)_Resultado["CoSala"]);
                            ReservaEncontrado.Cliente = ClienteDAO.Obtener((int)_Resultado["CoCliente"]);
                            ReservasEncontrados.Add(ReservaEncontrado);
                        }
                    }
                }
            }
            return ReservasEncontrados;
        }

        /**********************************************************************************************************/
        public ICollection<Reserva> ListarXBusqueda(int? codigo, string feinicio, string fefinal, decimal ssreserva, Sala sala, Cliente cliente)
        {
            string _Sentencia = @"SELECT * FROM Reserva WHERE CoReserva=1";
            ICollection<Reserva> ReservasEncontrados = new List<Reserva>();
            Reserva ReservaEncontrado = null;

            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND CoReserva=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (feinicio != null)
                    {
                        _Sentencia = _Sentencia + " AND FeInicio = feinicio";
                        _Comando.Parameters.Add(new SqlParameter("@feinicio", feinicio));
                    }
                    if (fefinal != null)
                    {
                        _Sentencia = _Sentencia + " AND FeFinal = @fefinal";
                        _Comando.Parameters.Add(new SqlParameter("@fefinal", fefinal));
                    }
                    if (ssreserva != 0)
                    {
                        _Sentencia = _Sentencia + " AND SsReserva = @ssreserva";
                        _Comando.Parameters.Add(new SqlParameter("@ssreserva", ssreserva));
                    }
                    if (sala!= null)
                    {
                        _Sentencia = _Sentencia + " AND CoSala=@sala";
                        _Comando.Parameters.Add(new SqlParameter("@sala", sala.CoSala));
                    }
                    if (cliente != null)
                    {
                        _Sentencia = _Sentencia + " AND CoCliente = cliente";
                        _Comando.Parameters.Add(new SqlParameter("@cliente", cliente.CoCliente ));
                    }
                    
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;

                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            ReservaEncontrado = new Reserva();
                            ReservaEncontrado.CoReserva = (int)_Resultado["CoReserva"];
                            ReservaEncontrado.FeInicio = (string)_Resultado["FeInicio"];
                            ReservaEncontrado.FeFinal = (string)_Resultado["FeFinal"];
                            ReservaEncontrado.SsReserva = (decimal)_Resultado["SsReserva"];
                            ReservaEncontrado.Sala = SalaDAO.Obtener((int)_Resultado["CoSala"]);
                            ReservaEncontrado.Cliente = ClienteDAO.Obtener((int)_Resultado["CoCliente"]);
                            ReservasEncontrados.Add(ReservaEncontrado);
                        }
                    }
                }
            }
            return ReservasEncontrados;
        }

        /**********************************************************************************************************/
        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoReserva) FROM Reserva";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}